/**
 * 输入abc
 *      输出abc acb bac bca cab cba
 */
/**
 * 使用回溯法
 *      temp:记录一个字符 用域存储当前需要进入排列的字符
 *      current:记录一个字符串 用于记录当前已经排列好的字符
 *      queue:记录一个队列,用域存储还被排列的字符
 * 步骤:
 *      每次排列将temp添加到current
 *      如果queue为空,则本次排列完成,将current加入到结果数组中,结束递归
 *      如果queue不为空,说明还有未排列的字符
 *      递归排列queue中剩余的字符
 *      为了不影响后续排列 每次队规完成,将当前递归的字符temp加回队列
 */
function Permutation (str) {
    const result = []
    if (str) {
        queue = str.split('')
        PermutationCore(queue, result)
    }
    result.sort()
    console.log(result.sort())
    return [...new Set(result)]
}
function PermutationCore (queue, result, temp = '', current = '') {
    current += temp
    if (queue.length === 0) {
        result.push(current)
        return
    }
    for (let i = 0; i < queue.length; i++) {
        //shift()方法删除数组开头的第一个元素
        temp = queue.shift()
        PermutationCore(queue, result, temp, current)
        queue.push(temp)
        console.log(queue)
    }
}
let res = Permutation('abc')
console.log(res);
